/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hoja.de.trabajo5;

/**
 *
 * @author FAMILIA
 */
//Se importan los paquetes necesarios para el funcionamiento del programa.
import java.util.AbstractList;

public class ListaCircular<E> extends AbstractList<E>{
    
    /**
     * Número de elementos en la lista circular.
     * Protected: sólo esta clase puede modificarla.
     */
    protected int contador2;
    
    /**
     * Protected: sólo esta clase puede modificarla.
     * Se utilizan nodos, para poder identificar correctamente, los lugares
     *  en los que está un elemento.
     */
    protected Nodo<E> cola2;
    
    /**
     * Constructor de la clase.
     * @pre Crea una lista circual nueva, vacía.
     */
    public ListaCircular()
    {
	cola2 = null;
	contador2 = 0;
    }

    /**
     * Agrega un elemento a la cabeza de la lista.
     * 
     * @pre valor no nulo.
     * @post agrega el valor a la cabeza de la lista.
     * 
     * @param value  el elemento que se quiere agregar al inicio de la lista.	
     */
    public void addFirst(E value){
	Nodo <E> temp = new Nodo<E>(value);
        if (cola2 == null) { // first value added
	    cola2 = temp;
	    cola2.setNext(cola2);
	} else { // element exists in list
	    temp.setNext(cola2.next());
	    cola2.setNext(temp);
	}
	contador2++;
    }

    /**
     * Agrega un elemento a la cola de la lista.
     * 
     * @pre valor no nulo.
     * @post agrega el valor a la cola de la lista.
     * 
     * @param value  el elemento que se quiere agregar al final de la lista.	
     */
    public void addLast(E value)
    {
	// new entry:
	addFirst(value);
	cola2 = cola2.next();
    }

    /**
     * Elimina la cabeza de la lista.
     * @pre No está vacía la lista.
     * @post regresa y elimina, la cabeza de la lista.
     * 
     * @return el valor del primer elemento de la lista.
     */
    public E removeFirst()
    {
	Nodo<E> temp = cola2.next();
	if (cola2 == cola2.next()) {
	    cola2 = null;
	} else {
	    cola2.setNext(temp.next());
	    temp.setNext(null);
	}
	contador2--;
	return temp.value();
    }
    
    /**
     * Deja ver el valor del primer elemento de la lista, pero no lo elimina.
     * @return El primer elemento de la lista.
     */
    public E peek(){
        return cola2.next().value();
    }

    /**
     * Determina el tamaño de la lista.
     * @post Tamaño de la lista.
     * @return  Número de elementos en la lista.
     */
    @Override
    public int size()
    {
	return contador2;
    }

    /**
     * @param i
     * @return null
     */
    @Override
    public E get(int i) {
        return null;
    }
}

